package cn.tedu.oop2;

public class TestExtends {
    public static void main(String[] args) {
        //9.创建3个类的对象
        Animal a = new Animal(); //Animal a在其它类中创建,在栈内存, new Animal在堆内存
        Cat c = new Cat();
        Dog d = new Dog();
        //10.进行方法的调用测试--不接方法的返回值
        /*a.eat();
        a.show();
        c.eat();
        c.show();
        d.eat();
        d.show();*/
        //11.进行方法的调用测试--不接方法的返回值
        Animal show = a.show();//a.show().show();(很少用) // a.{System.out.println("我是一只小动物~")+return a}
        System.out.println(show);// a.{System.out.println("我是一只小动物~")+return a}
        //show.eat();//通过对象地址值继续调用方法//a.{System.out.println("我是一只小动物~")+return a}+System.out.println("小动物Animal吃啥都行~");
        //System.out.println(show.show());     //不这么用//a.show().show() //a.show().show() = a.{System.out.println("我是一只小动物~")+return a}.{System.out.println("我是一只小动物~")+return a};
        //7;
        //Animal animal = a.show();//重复调用show()方法
        //a.sout+return a地址值
        //System.out.println(animal);//打印对象的地址值//打印完了就不用再打印,上级地址值只有打印了才有显示,没打印,会在下一级调用中打印,并且将后面的地址池排除,无法进入(占房,先来为大),,,in ors.只打印一个地址值
        //animal.show();//接到了返回值这个对象以后,可以继续使用这个对象
        /*int aaa = a.sum();
        System.out.println(aaa);//5
        System.out.println(aaa+10);//15*/
        //System.out.println("对 对象调用,含有的嵌套对象的方法的操作:");
        //a.show().show() = a.{System.out.println("我是一只小动物~")+return a}.{System.out.println("我是一只小动物~")+return a};
       /* Animal animal1 = animal.show(); //上一级对象,自动销毁?(没有使用对象,对象就在堆内存消失,而局部变量是方法结束就停止使用),调用了下一个方法//
        System.out.println(animal1);*/  //a(create, invoke then gone).sout.a(return then gone).sout.a(return )

    }
}
//1.定义父类
class Animal{
    /*public static void main(String[] args) {
        Animal animal = new Animal();
    }*/
        /*public int sum(){
        return 5;
    }*/
    //4.定义父类的普通方法
    public void eat(){
        System.out.println("小动物Animal吃啥都行~");
    }
    //6.定义父类的方法show(),返回值类型Animal,打印:我是一只小动物~
    public Animal show(){
        System.out.println("我是一只小动物~");
        Animal a = new Animal();
        return a;
    }

}
//2.1定义子类Cat
class Cat extends Animal{
    //5.1在Cat子类中重写父类的eat()
    @Override //验证方法重写是否正确,给程序员自己看
    public void eat(){
        System.out.println("小猫爱吃小鱼干!");
    }
    //7.Cat类重写父类的show(),返回值类型Animal,打印:我是一只小猫!
    @Override
    public Animal show(){
        System.out.println("我是一只小猫!~");
        Animal a = new Animal();
        return a;
    }
}
//2.2定义子类Dog
class Dog extends Animal{
    //5.2在Dog子类中重写父类的eat()
    @Override
    public void eat(){ //倒着看
        System.out.println("小狗爱吃肉骨头!");
    }
    //8.Dog类重写父类的show(),返回值类型Dog,打印:我是一只小狗!
    @Override
    public Dog show(){
        System.out.println("我是一只小狗!");
        Dog d = new Dog(); //ANimal的Dog子类型的变量d
        return d;
    }
}


